﻿

using Chapter03.DesginMode;

/**
 * 3 装饰者模式
 * 装饰对象
 * 欢迎来到星巴兹咖啡
 * 开放-关闭原则
 * 认识装饰者模式
 * 以装饰者构造饮料订单
 * 好了，这是目前所知道的一切……
 * 定义装饰者模式
 * 装饰我们的饮料
 * 办公室隔间对话
 * 新咖啡师傅特训
 * 写下星马兹的代码
 * 写饮料的代码
 * 写调料代码
 * 供应咖啡
 * 真实世界的装饰者：Java I/O
 * 装饰Java.io类
 * 编写自己的Java I/O装饰者
 * 测试你的新Java I/O装饰者
 * 模式访谈
 * 设计箱内的工具
 * 习题解答
 * 
 * OO基础
 * 抽象
 * 封装
 * 多态
 * 继承
 * 
 * OO设计原则
 * 封装变化，找出应用中可能需要变化之处，把这们独立出来，不要和那些不需要变化的代码混在一起
 * 多用组合，少用继承
 * 针对接口编程，而不是针对实现编程
 * 为了交互对象之间的松耦合设计而努力
 * 类应该对扩展开放，对修改关闭
 * 
 * OO模式
 * 装饰者模式——动态的将责任附加到对象上。想要扩展功能，装饰者提供有别于继承的另一种选择
 */
var beverage = new Espresso();
Console.WriteLine($"{beverage.Description}。${beverage.Cost}");

Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
Console.WriteLine($"{beverage2.Description}。${beverage2.Cost}");

Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
Console.WriteLine($"{beverage3.Description}。${beverage3.Cost}");
